package com.cskaoyan.bytestream.outs;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/*
        字节流写数据常见问题：
            1. 创建字节输出流到底做了哪些事情?
               1). 创建FileOutputStream对象的时候，jvm首先到操作系统，查找目标文件
                      a. 当发现目标文件不存在的时候， jvm会首先创建该目标文件(内容为空)
                         前提是目标文件的父目录是存在的

                      b. 当发现目标文件存在的时候, jvm默认会首先清空目标文件内容，最好准备
                         让，FileOutputStream, 从文件头，开始写入数据
               2). 在内存中，创建FileOutputStream对象
               3）. 在FileOutputStream对象和目标文件之间建立数据传输通道

         2. 数据写成功后，为什么要close()?
               a. 关闭此输出流
               b. 释放与此流有关的所有系统资源。

         3. 如何实现数据的换行? 核心通过换行符来完成该功能  '\n'
          换行符，在不同的操作系统中，表示方式是不一样的：
          类unix操作系统中：'\n'
          windows默认的换行表示: '\r'+'\n' 用windows自带的文本编辑器对于\n是否有换行效果，还和操作系统版本有关

        4.如何实现数据的追加写入?

           FileOutputStream(File file, boolean append)
              创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
              append - 如果为 true，则将字节写入文件末尾处，而不是写入文件开始处

          FileOutputStream(String name, boolean append)
             创建一个向具有指定 name 的文件中写入数据的输出文件流。
             append - 如果为 true，则将字节写入文件末尾处，而不是写入文件开始处

          a. 对于同一输出流对象，多次写入的数据，会依次写入目标文件，
             先写入的数据在前，后写入的数据在后(非追加写入)

          b. 所谓追加写入，针对的是不同的输出流对象，向文件写入数据的情况，所谓追加写入，是指
             当使用不同的输出流对象向文件中写入数据的时候，从文件已有内容之后开始写入

        5. 给I/0流操作加上异常处理

 */
public class Demo3 {

    public static void main(String[] args) {

        String data = "hello, world";

        OutputStream os = null;
        try {
            // 创建一个FileStreamOutput对象
            // FileOutputStream(String name, boolean append)
            os = new FileOutputStream("e:\\a.txt", true);

            // 调用write方法写入 依次写入
            os.write(data.getBytes());

            //写入换行字符
            os.write('\n');

            // 调用write方法写入
            os.write(data.getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭流，并释放资源
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
